#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
数据库表结构验证脚本
用于验证已创建的表结构是否符合模型定义
"""

# 导入操作系统相关模块
import os
# 导入系统相关模块
import sys
# 导入dotenv用于加载环境变量
from dotenv import load_dotenv
# 导入SQLAlchemy相关组件
from sqlalchemy import create_engine, inspect

# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

# 加载环境变量
load_dotenv()

def verify_tables():
    """
    验证表结构
    检查数据库中的表结构是否与模型定义一致
    """
    print("开始验证数据库表结构...")
    
    try:
        # 导入模型
        from models import engine, User, File, Workflow, Result, Role, Permission, RolePermission
        
        # 创建检查器
        inspector = inspect(engine)
        
        # 获取所有表名
        tables = inspector.get_table_names()
        print(f"数据库中的表: {tables}")
        
        # 验证每个表的结构
        models = {
            'users': User,
            'files': File,
            'workflows': Workflow,
            'results': Result,
            'roles': Role,
            'permissions': Permission,
            'role_permissions': RolePermission
        }
        
        for table_name, model in models.items():
            if table_name in tables:
                print(f"\n验证表 '{table_name}':")
                
                # 获取表的列信息
                columns = inspector.get_columns(table_name)
                column_names = [col['name'] for col in columns]
                print(f"  列: {column_names}")
                
                # 检查索引
                indexes = inspector.get_indexes(table_name)
                print(f"  索引数量: {len(indexes)}")
                
                # 检查主键
                pk_constraint = inspector.get_pk_constraint(table_name)
                if pk_constraint and pk_constraint['constrained_columns']:
                    print(f"  主键: {pk_constraint['constrained_columns']}")
                
                # 检查唯一约束
                unique_constraints = inspector.get_unique_constraints(table_name)
                if unique_constraints:
                    print(f"  唯一约束: {len(unique_constraints)} 个")
                    for constraint in unique_constraints:
                        print(f"    - {constraint['column_names']}")
            else:
                print(f"警告: 表 '{table_name}' 不存在")
        
        print("\n表结构验证完成!")
        
    except Exception as e:
        print(f"验证表结构时出错: {e}")
        import traceback
        traceback.print_exc()
        sys.exit(1)

# 程序入口
if __name__ == "__main__":
    verify_tables()